package com.zoespeer.food_delivery_comment_api.service.impl;

import com.zoespeer.food_delivery_comment_api.service.FileService;
import com.zoespeer.food_delivery_comment_api.vo.FileUploadResultVO;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

/**
 * 文件上传服务实现
 */
@Service
public class FileServiceImpl implements FileService {

    // 1. 本地存储路径（需提前创建该文件夹，或在代码中自动创建）
    private static final String LOCAL_UPLOAD_DIR = "D:/food_delivery_uploads/";
    // 2. 前端访问的基础URL（需与静态资源映射或Nginx配置一致）
    private static final String BASE_ACCESS_URL = "http://localhost:8080/uploads/";

    @Override
    public FileUploadResultVO uploadFile(MultipartFile file) {
        // 1. 校验文件是否为空
        if (file.isEmpty()) {
            throw new RuntimeException("上传文件不能为空");
        }

        try {
            // 2. 处理文件名：生成唯一文件名（避免重复覆盖）
            String originalFileName = file.getOriginalFilename();
            // 获取文件后缀（如 .jpg、.mp4）
            String fileSuffix = originalFileName.substring(originalFileName.lastIndexOf("."));
            // 生成唯一文件名（UUID + 后缀）
            String uniqueFileName = UUID.randomUUID().toString() + fileSuffix;

            // 3. 确保存储目录存在（不存在则创建）
            Path uploadDirPath = Paths.get(LOCAL_UPLOAD_DIR);
            if (!Files.exists(uploadDirPath)) {
                Files.createDirectories(uploadDirPath);
            }

            // 4. 保存文件到本地目录
            Path targetFilePath = uploadDirPath.resolve(uniqueFileName);
            Files.write(targetFilePath, file.getBytes());

            // 5. 生成文件访问URL
            String fileAccessUrl = BASE_ACCESS_URL + uniqueFileName;

            // 6. 封装返回结果
            FileUploadResultVO result = new FileUploadResultVO();
            result.setUrl(fileAccessUrl);
            return result;

        } catch (IOException e) {
            throw new RuntimeException("文件上传失败：" + e.getMessage());
        }
    }
}